package pe.com.hermes.hermetic.web.controller.consultas;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ConfigArchIndicadoresBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.service.TablService;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.forms.HMF3012Form;

import java.io.DataOutputStream;
import java.io.File;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import java.io.InputStream;
import java.io.InputStreamReader;

import java.net.URI;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

@SessionAttributes(value={"form","mostrarGrilla","codOpci"})
@RequestMapping("/mostrarHWF3012.html")
@Controller
public class ConsultaIndServicioController implements IController {
    private Logger logger = Logger.getLogger(this.getClass());
    
    @Autowired
    private HermeticFacade servicioHermetic;
    
    @Autowired
    private TablService tablService;
    
    @RequestMapping(method=RequestMethod.GET)
    protected String showForm(ModelMap model, HttpServletRequest request) throws Exception {
        
        HMF3012Form form=new HMF3012Form();
        String codCliente=(String)request.getSession(false).getAttribute("cliente");
        List listaTiposArchivo= servicioHermetic.listTipoArchIndiXClie(codCliente);
        List listClientes = servicioHermetic.getListClieArchInd("");
        model.put("listaTiposArchivo",listaTiposArchivo);
        model.put("listaClientes",listClientes);
        model.put(FORM_KEY,form);
        model.put("mostrarGrilla",false);
        String codOpci = IWebOpciones.CONSUL_ARCH_IND_SERV;
        String desOpci = servicioHermetic.getDesOpci(codOpci, request);
        model.put("codOpci",codOpci);
        model.put("desOpci",desOpci);
        AuditBean auditBean = new AuditBean(CONSUL_ARCH_IND_SERV);
        servicioHermetic.inseAudit(auditBean);
        return FORM_CONS_ARCH_INDI;
    }
    
    @RequestMapping(params={"accion=mostrar","tipoReporte","nombre","fechaInic","fechaDest","cliente"})
    private String mostrar (@RequestParam("cliente") String cliente,@RequestParam("tipoReporte") String tipoReporte,@RequestParam("nombre")String nombre,
                            @RequestParam("fechaInic") String fechaInic,@RequestParam("fechaDest") String fechaDest,
                            ModelMap model,@ModelAttribute(FORM_KEY) HMF3012Form form, HttpServletRequest request) throws Exception {    
      
        List listaArchivos=new ArrayList();
        String mensajeError="";
        //Invocar el servicio de busqueda
        try{
            //String cliente=(String)request.getSession(false).getAttribute("cliente");
            
            //Parsear las fechas
            /*
             String mesStringInic="";
             String anhoStringInic="";
             String mesStringDest="";
             String anhoStringDest="";
             if (fechaInic.indexOf("-")!=-1)
              {
                mesStringInic=fechaInic.substring(0,fechaInic.indexOf("-"));
                anhoStringInic=fechaInic.substring(fechaInic.indexOf("-")+1,fechaInic.indexOf("-")+5);
              }
            
            if (fechaDest.indexOf("-")!=-1)
             {
                mesStringDest=fechaDest.substring(0,fechaDest.indexOf("-"));
                anhoStringDest=fechaDest.substring(fechaDest.indexOf("-")+1,fechaDest.indexOf("-")+5);
             }
            String mesInic=Util.obtenerMesNumero(mesStringInic);
            String mesDest=Util.obtenerMesNumero(mesStringDest);
            if ("-1".equals(mesInic)){
                mensajeError="La fecha de inicio no tiene formato correcto";
                throw new Exception (mensajeError);
            }
            if ("-1".equals(mesDest)){
                mensajeError="La fecha de fin no tiene formato correcto";
                throw new Exception (mensajeError);
            }
            String fechaFormatInic="01/"+mesInic+"/"+anhoStringInic;
            String fechaFormatDest="01/"+mesDest+"/"+anhoStringDest;
            */
            String fechaFormatInic=fechaInic;
            String fechaFormatDest=fechaDest;
            //Validar las fechas
            /*
            DateFormat df=new SimpleDateFormat("dd/mm/yyyy");
            Calendar calInic=Calendar.getInstance();
            Calendar calDest=Calendar.getInstance();
            calInic.setTime(df.parse(fechaFormatInic));
            calDest.setTime(df.parse(fechaFormatDest));
            if (calDest.compareTo(calInic)<0){
                mensajeError="La fecha de fin debe ser mayor que la fecha de inicio";
                throw new Exception (mensajeError); 
            }
            */
            
            listaArchivos=servicioHermetic.listIndicServicio(cliente,tipoReporte,nombre,fechaFormatInic,fechaFormatDest);
            //Mostrar mensajes de error si hacen falta y listas
        }catch(Exception ex){
            //ex.printStackTrace();
            logger.error("Error al mostrar lista de Indicadores de Servicio",ex);
            model.put("mensajeError",mensajeError);
            model.put(FORM_KEY,form);
            return FORM_DESC_ARCH_INDI;
        }
        model.put(FORM_KEY,form);
        model.put("listaArchivos",listaArchivos);
        model.put("mostrarGrilla",true);
        return FORM_CONS_ARCH_INDI;
    }
    
    
    @RequestMapping(params={"accion=getListTipoArch","cliente"})
    protected @ResponseBody ConfigArchIndicadoresBean[] getListTipoArch(@RequestParam("cliente") String cliente ,ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: getListTipoArch");
        List listadoTipoArchIndi = new ArrayList();
        ConfigArchIndicadoresBean[] listadoTipoArchIndiArray = null;
        try{
            listadoTipoArchIndi=servicioHermetic.listTipoArchIndiXClie(cliente);
        }catch(Exception e){
            logger.error(e);
        }
        listadoTipoArchIndiArray = new ConfigArchIndicadoresBean[listadoTipoArchIndi.size()];
        listadoTipoArchIndi.toArray(listadoTipoArchIndiArray);
        return listadoTipoArchIndiArray;
    }  
    
    @RequestMapping(params={"accion=eliminarArchIndicador","tipo","cliente","fecha"})
    protected String eliminarArchIndicador(@RequestParam("tipo") String tipoReporte,@RequestParam("cliente")String cliente,
                                           @RequestParam("fecha")String fecha,ModelMap model,@ModelAttribute(FORM_KEY) HMF3012Form form, HttpServletRequest request) throws Exception{
        
        
        logger.info(this.getClass().toString()+" "+"metodo: getListTipoArch");
        List listaArchivos = new ArrayList();
        
        //Invocar al servicio que elimina el archivo
        String usuario=(String)request.getSession(false).getAttribute("usuario");
        int error=servicioHermetic.eliminaArchIndicador(cliente,tipoReporte,fecha,"","",usuario);
        //Invocar de nuevo a la busqueda
        if (error>0){
            logger.error("Error al eliminar un archivo Indicador de Servicio");
            model.put("mensajeError","Error al eliminar el archivo");
            model.put(FORM_KEY,form);
            return FORM_DESC_ARCH_INDI;
        }
        //Parsear las fechas
        /*
         String mesStringInic="";
         String anhoStringInic="";
         String mesStringDest="";
         String anhoStringDest="";
         String fechaInic=form.getFechaInic();
         String fechaDest=form.getFechaDest();
         if (fechaInic.indexOf("-")!=-1)
         {
              mesStringInic=fechaInic.substring(0,fechaInic.indexOf("-"));
              anhoStringInic=fechaInic.substring(fechaInic.indexOf("-")+1,fechaInic.indexOf("-")+5);
        }
                    
        if (fechaDest.indexOf("-")!=-1)
        {
          mesStringDest=fechaDest.substring(0,fechaDest.indexOf("-"));
          anhoStringDest=fechaDest.substring(fechaDest.indexOf("-")+1,fechaDest.indexOf("-")+5);
        }
        String mesInic=Util.obtenerMesNumero(mesStringInic);
        String mesDest=Util.obtenerMesNumero(mesStringDest);
                    
        String fechaFormatInic="01/"+mesInic+"/"+anhoStringInic;
        String fechaFormatDest="01/"+mesDest+"/"+anhoStringDest;        
        */
        String fechaFormatInic=form.getFechaInic();
        String fechaFormatDest=form.getFechaDest();
        
        listaArchivos=servicioHermetic.listIndicServicio(form.getCliente(),form.getTipoReporte(),form.getNombre(),fechaFormatInic,fechaFormatDest);
         model.put(FORM_KEY,form);
         model.put("listaArchivos",listaArchivos);
         return FORM_CONS_ARCH_INDI; 
               
    }
    
    
    @RequestMapping(params={"accion=descargarArchivo"})
    protected void descargarArchivo(ModelMap model,@ModelAttribute(FORM_KEY) HMF3012Form form, HttpServletRequest request, HttpServletResponse response) throws Exception{
        
        String ruta=form.getRutaDescarga();
        if (ruta.indexOf(" ")!=-1){
            ruta=ruta.replaceAll(" ","%20");
        }
        String nombre=form.getNombreDescarga();
        String extension=ruta.substring(ruta.indexOf("."),ruta.length());
        String fileName=nombre+extension;
        try{
            
              
            File archivo=new File(new URI(ruta));
            InputStream isr = new FileInputStream (archivo);
            ServletOutputStream servletOutputStream = response.getOutputStream();    
            
            response.addHeader("Content-type", "application/octet-stream");
            response.addHeader("Content-Disposition", "attachment;filename="+fileName);
            response.setContentType("Content-type: application/octet-stream");
            
            response.setHeader("Cache-Control","cache"); // HTTP 1.1
            response.setHeader("Pragma","cache"); // HTTP 1.0
            response.setDateHeader ("Expires", -1);          
            
            long length = archivo.length();
            byte[] bytes = new byte[(int)length];
            
            // Read in the bytes
            int offset = 0;
            int numRead = 0;
            while (offset < bytes.length && (numRead=isr.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
            }
            
            isr.close();
            servletOutputStream.write(bytes);
            servletOutputStream.flush();
            servletOutputStream.close();
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
               
    }
}
